package com.zxgllhh.run;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.zxgllhh.db.ConnectionFactory;
import com.zxgllhh.db.JDBCConnectionConfiguration;
import com.zxgllhh.domain.ConnectionContext;
import com.zxgllhh.domain.Table;
import com.zxgllhh.generator.GenaratorManager;
import com.zxgllhh.service.TableManager;
import com.zxgllhh.utils.PropertyUtils;

/**
 * 
 * @author Zhao,XingGuo
 * @version 2.0 2010-01-21 重写了第一版所有代码，结构更清晰，更容易扩展，部分参考了ibator,在这里对Jeff
 *          Butler表示感谢
 * @version 2010-03-04 自动适应mysql数据库
 * @version 2010-07-02号经过优化程序运行效率提升了4倍。由原来的87s提升到现在的主程序15s,全部子程序结束20s
 * 
 */
public class Runner {

	public static void main(String[] args) {

		long beginTime = System.currentTimeMillis();

		// 取得connection的必要资源
		String driverClassName = PropertyUtils.getProperty("jdbc.driverClassName");
		String url = PropertyUtils.getProperty("jdbc.url");
		String username = PropertyUtils.getProperty("jdbc.username");
		String password = PropertyUtils.getProperty("jdbc.password");

		JDBCConnectionConfiguration jdbc = new JDBCConnectionConfiguration(driverClassName, url, username, password);
		Connection connection = null;
		try {
			// --start 强大的ConnectionFactory类可以得到oracle,sql
			// server,mysql等数据库的connection,功能强劲
			connection = ConnectionFactory.getInstance().getConnection(jdbc);
			// --end

			// --start for save connection
			ConnectionContext.setConnection(connection);
			// --end

			// --start to get remarks only for oracle
			String databaseName = ConnectionContext.getConnection().getMetaData().getDatabaseProductName();
			System.out.println("使用的数据库类型为 ："+databaseName);
			if (databaseName.equalsIgnoreCase("oracle")) {
				((oracle.jdbc.driver.OracleConnection) connection).setRemarksReporting(true);
			}
			// --end

			// --start
			// 获取需要生成代码的表,默认为全部的表(当总表数小于100时尽量在配置文件中设置allTables=true,否则设置allTables=false)
			List<String> allTables = new ArrayList<String>();
			if (PropertyUtils.getProperty("allTables").equalsIgnoreCase("false")) {
				String t = PropertyUtils.getProperty("yourSpecialTables");
				String tables[] = t.split("[,]");
				for (String table : tables) {
					allTables.add(table);
				}
			} else {
				allTables = TableManager.getAllTableNames(connection);
			}
			System.out.println(allTables.size());
			// --end
			
			// 获得tableList,这个tableList很强大，不仅仅用来做代码生成，批量更改数据库也可以
			List<Table> tableList = TableManager.getTableList(connection, allTables);

			long time = System.currentTimeMillis();
			System.out.println("middle it costed :" + (time - beginTime) + " milliseconds");
			
			// --start 验证这个强大的tableList，程序稳定时可以注释掉这句代码
			//Check.p(tableList);
			// --end

			// --start 根据tableList循环遍历生成代码
			GenaratorManager.go(tableList);
			// --end

			// 释放资源
			connection.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		long endTime = System.currentTimeMillis();
		Long costTime = endTime - beginTime;
		System.out.println("it costed :" + costTime + " milliseconds");
	}

}
